home *** CD-ROM | disk | FTP | other *** search
/ Resource Library: Multimedia / Resource Library: Multimedia.iso / utils / graphic / viewers / general / msdos / ncsa / src / ega.asm < prev    next >
Encoding:
Assembly Source File  |  1989-04-22  |  14.3 KB  |  454 lines

  1. ;
  2. ;  EGA GRAPHICS DRIVER 
  3. ;
  4. ;  supports raster graphics on the Enhanced Adapter
  5. ;
  6. ;      Tim Krauskopf               Spring 1986
  7. ;
  8. ;  National Center for Supercomputing Applications
  9. ;  605 E. Springfield
  10. ;  Champaign, IL 61820
  11. ;  (217) 244-0074
  12. ;
  13. ;
  14.         TITLE   EGA GRAPHICS RASTER DRIVER
  15.         NAME    EGA
  16.         INCLUDE DOS.MAC
  17.         SETX
  18. ;
  19. ;  Define where the registers are
  20. ;
  21. SEQ        EQU        03C4H
  22. MAPREG    EQU        2
  23. MAPMASK    EQU        03C5H
  24. GCHIP    EQU        03CEH
  25. DRREG   EQU     3
  26. MODEREG EQU     5
  27. BITREG    EQU        8
  28. BITMASK    EQU        03CFH
  29. ;
  30.         DSEG
  31. FLAG    DB      0            ; HAVE WE SET REGS UP
  32.         ENDDS
  33.  
  34.         PSEG
  35.         PUBLIC  EGAPOINT,EGALINE,EGALINE2,EGALINEA
  36.         PUBLIC    INITEGA,RESETEGA,EGAPAL
  37. ;******************************************************************
  38. ;  INITEGA
  39. ;    use the BIOS to set mode 10 on the EGA board
  40. ;
  41. INITEGA    PROC    FAR
  42.         MOV        AX,10H            ; set to hi-res mode for EGA
  43.         INT     10h                ; video
  44.         RET
  45. INITEGA    ENDP
  46.  
  47. RESETEGA    PROC    FAR
  48.         MOV        AX,3            ; set to color character mode
  49.         INT        10h
  50.         RET
  51. RESETEGA    ENDP
  52.  
  53. ;*******************************************************************
  54. ;  PALETTE 
  55. ;     set one element of the EGA's palette select
  56. ;
  57. ;  usage:  egapal(reg,setting);
  58. ;             reg (0-15)        EGA's palette regs
  59. ;             setting            one byte, what to write there
  60. ;
  61. EGAPAL    PROC    FAR
  62.         PUSH    BP
  63.         MOV        BP,SP
  64.         MOV        BL,[BP+X]        ; register #
  65.         MOV        BH,[BP+X+2]        ; value
  66.         MOV        AX,01000H        ; set palette element
  67.         INT        10h
  68.         POP        BP
  69.         RET
  70. EGAPAL    ENDP
  71.  
  72. ;*****************************************************************
  73. ;  Puts an absolute pixel in the given color
  74. ;
  75. ;   usage:   egapoint(x,y,color,table)
  76. ;            x,y = point location
  77. ;            color = integer color number  0 to 255
  78. ;            table = translation table of 256 bytes for XLAT
  79. ;
  80. ;   BUG:  will only write on black background, see egaline for
  81. ;         clearing all four planes before writing to specified planes
  82. ;         in that color
  83. ;
  84. EGAPOINT    PROC    FAR
  85.         PUSH    BP
  86.         MOV        BP,SP
  87.         MOV     AL,FLAG  
  88.         OR      AL,AL
  89.         JNZ     NOSETUP
  90.         CALL    SETUPG            ; set up the mask regs
  91.         MOV     FLAG,1            ; set the flag
  92. NOSETUP:
  93.         MOV     CX,[BP+X+8]       ; get segment of transtable
  94.         MOV     BX,[BP+X+6]       ; get offset of transtable
  95.         MOV        AX,[BP+X+4]       ; get the color param = 3rd param
  96.         PUSH DS
  97.         MOV  DS,CX                ; set ds for the transtable
  98.         XLATB                     ; pick up translated color
  99.         POP     DS
  100.         MOV        DX,MAPMASK
  101.         OUT        DX,AL             ; set the mask to this color
  102.         MOV        AX,0A000H
  103.         MOV     ES,AX             ; set for addressing
  104.         MOV        AX,[BP+X+2]       ; get y value 0 < y < 350
  105.         MOV        BX,80
  106.         MUL     BX                ; multiply by 80 bytes/line
  107.         MOV     DI,AX             ; put in DI
  108.         MOV     AX,[BP+X]         ; get x value 0 < x < 640
  109.         MOV     BX,AX             ; save it
  110.         MOV     CL,3
  111.         SHR     AX,CL             ; divide by 8
  112.         ADD     DI,AX             ; add it to di = byte offset
  113.         ;
  114.         MOV     CX,BX
  115.         AND     CX,0007H          ; save only the right three bits
  116.         MOV     BL,80H            ; here's a bit
  117.         SHR        BL,CL             ; move it over some
  118.         MOV     DX,BITMASK        ; set the mask
  119.         MOV     AL,BL             
  120.         OUT     DX,AL             ;  send it
  121. ;
  122.         MOV        AL,0FFH           ; set all bits
  123.         MOV        AH,ES:[DI]        ; latch the bytes
  124.         STOSB                     ; place that bit on bit mask
  125.  
  126.         
  127.         POP        BP
  128.         RET
  129. EGAPOINT    ENDP
  130.  
  131. SETUPG:
  132.         MOV        DX,GCHIP
  133.         MOV        AL,MODEREG
  134.         OUT        DX,AL             ; choose write mode 0
  135.         INC        DX
  136.         MOV        AL,0
  137.         OUT        DX,AL             ; clear mode reg to 0
  138.         DEC     DX
  139.         MOV        AL,DRREG          ; clear function select = Replace
  140.         OUT        DX,AL
  141.         INC     DX
  142.         MOV        AL,0h             ; clear all
  143.         OUT        DX,AL
  144. ;
  145.         MOV        AL,MAPREG         ; want to access mapreg from 
  146.         MOV        DX,SEQ            ; sequencer set of regs
  147.         OUT        DX,AL
  148.         MOV        AL,BITREG         ; want to access bitreg from
  149.         MOV     DX,GCHIP          ; graphics chip's regs
  150.         OUT        DX,AL
  151.         MOV        DX,BITMASK        ; set up the bitmask = no masking
  152.         MOV        AL,0FFH           ; all bits on
  153.         OUT        DX,AL
  154.         RET
  155. ;
  156. ;**************************************************************************
  157. ;  EGALINE
  158. ;
  159. ;   Write a stream of colors (represented by bytes) to the EGA, with 
  160. ;   a translation table for the EGA color map.
  161. ;
  162. ;   Usage:     egaline(x,y,colorbuffer,n,table,xoff)
  163. ;            x,y = point to start line
  164. ;            colorbuffer = 4 byte pointer to stream of 
  165. ;            n    bytes.
  166. ;            table  = 4 byte pointer to translation table, 256 bytes
  167. ;                      long for XLAT instruction
  168. ;             xoff    = offset into the line to be sent to the screen
  169.  
  170. EGALINE    PROC    FAR
  171.         PUSH    BP
  172.         MOV        BP,SP
  173.         MOV     AL,FLAG  
  174.         OR      AL,AL
  175.         JNZ     NOSETUP2
  176.         CALL    SETUPG            ; set up the mask regs
  177.         MOV     FLAG,1            ; set the flag
  178. NOSETUP2:
  179.         PUSH    DS                ; save our ds
  180.         MOV     AX,[BP+X+6]       ; get color table segment
  181.         MOV     DS,AX             ; use it now
  182.  
  183.         MOV        AX,0A000H
  184.         MOV     ES,AX             ; set for addressing
  185.         MOV        AX,[BP+X+14]; GET THE X OFFSET INTO THE ARRAY
  186.         CMP        AX,0        ; CHECK FOR NEGATIVE OFFSET
  187.         JGE        OKSIGN        ; JUMP AROUND FIXING THE WINDOW IF POSITIVE
  188.         NEG        AX            ; TAKE THE OPPOSITE VALUE
  189.         ADD        AX,[BP+X]    ; AND ADD IT TO THE POSITION ON THE SCREEN
  190.         MOV        [BP+X],AX    ; AND RE-STORE THE POSITION
  191.         MOV        AX,[BP+X+8]    ; GET THE NEGATIVE OFFSET AGAIN
  192.         ADD        AX,[BP+X+8]    ; REDUCE THE NUMBER OF BYTES TO COPY TO THE SCREEN
  193.         MOV        [BP+X+8],AX    ; AND STORE THE NUMBER OF BYTES AGAIN
  194. OKSIGN:
  195.         MOV        [BP+X+14],AX; PUT THE OFFSET BACK
  196. ;
  197.         MOV        AX,[BP+X+2]       ; get y value 0 < y < 350
  198.         MOV        BX,80
  199.         MUL     BX                ; multiply by 80 bytes/line
  200.         MOV     DI,AX             ; put in DI
  201.         MOV     AX,[BP+X]         ; get x value 0 < x < 640
  202.         MOV     BX,AX             ; save it
  203.         MOV     CL,3
  204.         SHR     AX,CL             ; divide by 8
  205.         ADD     DI,AX             ; add it to di = byte offset
  206.         ;
  207.         MOV     CX,BX
  208.         AND     CX,0007H          ; save only the right three bits
  209.         MOV     BL,080H           ; here's a bit
  210.         ROR        BL,CL             ; move it over some
  211. ;
  212. ;  At this point, bl has the bit mask for the first bit in the line
  213. ;  Keep rotating it and set the mask for each bit to write
  214. ;
  215.         MOV     CX,[BP+X+8]       ; get count of bytes
  216.         CMP        CX,0              ; CHECK FOR ZERO BYTES
  217.         JL        LINEDONE          ; JUMP TO THE END OF THE ROUTINE
  218.         MOV     SI,[BP+X+4]       ; where to get the new colors
  219.         ADD     SI,[BP+X+14]      ; add in the x offset into the line
  220.  
  221.         MOV     AH,BL             ; keep bit rotation in ah
  222.         MOV     DX,[BP+X+12]      ; get segment of transtable
  223.         MOV     BX,[BP+X+10]      ; get offset of transtable
  224.  
  225. NEXTBIT:
  226.         LODSB                     ; get the next color to al
  227.         PUSH DS
  228.         MOV  DS,DX                ; set ds for the transtable
  229.         XLATB                     ; pick up translated color to al
  230.         PUSH AX                   ; need it later
  231.  
  232.         MOV     DX,BITMASK        ; set the bitmask to current rotation
  233.         MOV     AL,AH
  234.         OUT     DX,AL             ;  send it
  235.  
  236.         MOV        DX,MAPMASK
  237.         MOV     AL,0FH            ; open all bit planes
  238.         OUT        DX,AL             ; send it
  239.  
  240.         MOV        AL,ES:[DI]        ; latch the whole set of bytes
  241.         MOV     BYTE PTR ES:[DI],0H  ; clear all four planes to 0 at this bit
  242.         POP        AX                ; get real color back
  243.         OUT        DX,AL              ; send it to set the color planes
  244.  
  245.         MOV     DX,DS             ;  recover what was in dx
  246.         POP     DS
  247. ;
  248.         MOV        AL,0FFH           ; set all bits
  249.         CMP     AH,01             ; see if we are at end of byte
  250.         JZ      INCSTORE
  251.  
  252. NONINC:
  253.         MOV     ES:[DI],AL        ; write the bit from bitmask
  254.         ROR     AH,1              ; rotate me
  255.         LOOP    NEXTBIT          ; go back for next one
  256.         JMP     LINEDONE
  257.  
  258. INCSTORE:
  259.         STOSB                     ; place that bit on bit mask and next byte
  260.         ROR     AH,1              ; rotate me
  261.         LOOP    NEXTBIT
  262.  
  263. LINEDONE:
  264.         POP     DS        
  265.         POP        BP
  266.         RET
  267. EGALINE    ENDP
  268.  
  269.         
  270. EGALINE2    PROC    FAR
  271.         PUSH    BP
  272.         MOV        BP,SP
  273.         MOV     AL,FLAG  
  274.         OR      AL,AL
  275.         JNZ     NO2SETUP2
  276.         CALL    SETUPG            ; set up the mask regs
  277.         MOV     FLAG,1            ; set the flag
  278. NO2SETUP2:
  279.         PUSH    DS                ; save our ds
  280.         MOV     AX,[BP+X+6]       ; get color table segment
  281.         MOV     DS,AX             ; use it now
  282.  
  283.         MOV        AX,0A000H
  284.         MOV     ES,AX             ; set for addressing
  285.         MOV        AX,[BP+X+2]       ; get y value 0 < y < 350
  286.         MOV        BX,80
  287.         MUL     BX                ; multiply by 80 bytes/line
  288.         MOV     DI,AX             ; put in DI
  289.         MOV     AX,[BP+X]         ; get x value 0 < x < 640
  290.         MOV     BX,AX             ; save it
  291.         MOV     CL,3
  292.         SHR     AX,CL             ; divide by 8
  293.         ADD     DI,AX             ; add it to di = byte offset
  294.         ;
  295.         MOV     CX,BX
  296.         AND     CX,0007H          ; save only the right three bits
  297.         MOV     BL,0C0H           ; here's 2 bits
  298.         ROR        BL,CL             ; move it over some
  299. ;
  300. ;  At this point, bl has the bit mask for the first bit in the line
  301. ;  Keep rotating it and set the mask for each bit to write
  302. ;
  303.         MOV     CX,[BP+X+8]       ; get count of bytes
  304.         MOV     SI,[BP+X+4]       ; where to get the new colors
  305.  
  306.         MOV     AH,BL             ; keep bit rotation in ah
  307.         MOV     DX,[BP+X+12]      ; get segment of transtable
  308.         MOV     BX,[BP+X+10]      ; get offset of transtable
  309.  
  310. NEXT2BIT:
  311.         LODSB                     ; get the next color to al
  312.         PUSH DS
  313.         MOV  DS,DX                ; set ds for the transtable
  314.         XLATB                     ; pick up translated color to al
  315.         PUSH AX                   ; need it later
  316.  
  317.         MOV     DX,BITMASK        ; set the bitmask to current rotation
  318.         MOV     AL,AH
  319.         OUT     DX,AL             ;  send it
  320.  
  321.         MOV        DX,MAPMASK
  322.         MOV     AL,0FH            ; open all bit planes
  323.         OUT        DX,AL             ; send it
  324.  
  325.         MOV        AL,ES:[DI]        ; latch the whole set of bytes
  326.         MOV     BYTE PTR ES:[DI],0H  ; clear all four planes to 0 at this bit
  327.         POP        AX                ; get real color back
  328.         OUT        DX,AL              ; send it to set the color planes
  329.  
  330.         MOV     DX,DS             ;  recover what was in dx
  331.         POP     DS
  332. ;
  333.         MOV        AL,0FFH           ; set all bits
  334.         CMP     AH,03             ; see if we are at end of byte
  335.         JZ      INC2STORE
  336.  
  337. NON2INC:
  338.         MOV     ES:[DI],AL        ; write the bit from bitmask
  339.         ROR     AH,1              ; rotate me
  340.         ROR     AH,1              ; rotate me
  341.         LOOP    NEXT2BIT          ; go back for next one
  342.         JMP     LINE2DONE
  343.  
  344. INC2STORE:
  345.         STOSB                     ; place that bit on bit mask and next byte
  346.         ROR     AH,1              ; rotate me
  347.         ROR     AH,1              ; again
  348.         LOOP    NEXT2BIT
  349.  
  350. LINE2DONE:
  351.         POP     DS        
  352.         POP        BP
  353.         RET
  354. EGALINE2    ENDP
  355.  
  356. ;**************************************************************************
  357. ;  EGALINEA
  358. ;
  359. ;   Write a stream of colors (represented by bytes) to the EGA, with 
  360. ;   a translation table for the EGA color map.  This one includes arbitrary
  361. ;   width expansion.
  362. ;
  363. ;   Usage:     egalinea(x,y,colorbuffer,n,table,expansion)
  364. ;            x,y = point to start line
  365. ;            colorbuffer = 4 byte pointer to stream of 
  366. ;            n    bytes.
  367. ;            table  = 4 byte pointer to translation table, 256 bytes
  368. ;                      long for XLAT instruction
  369. ;            expansion = how much horizontal pixel expansion you want
  370. ;
  371.  
  372. EGALINEA    PROC    FAR
  373.         PUSH    BP
  374.         MOV        BP,SP
  375.         MOV     AL,FLAG  
  376.         OR      AL,AL
  377.         JNZ     NOSETA
  378.         CALL    SETUPG            ; set up the mask regs
  379.         MOV     FLAG,1            ; set the flag
  380. NOSETA:
  381.         PUSH    DS                ; save our ds
  382.         MOV     AX,[BP+X+6]       ; get color table segment
  383.         MOV     DS,AX             ; use it now
  384.  
  385.         MOV        AX,0A000H
  386.         MOV     ES,AX             ; set for addressing
  387.         MOV        AX,[BP+X+2]       ; get y value 0 < y < 350
  388.         MOV        BX,80
  389.         MUL     BX                ; multiply by 80 bytes/line
  390.         MOV     DI,AX             ; put in DI
  391.  
  392.         MOV     AX,[BP+X]         ; get x value 0 < x < 640
  393.         MOV     BX,AX             ; save it
  394.         MOV     CL,3
  395.         SHR     AX,CL             ; divide by 8
  396.         ADD     DI,AX             ; add it to di = byte offset
  397.         ;
  398.         MOV     CX,BX
  399.         AND     CX,0007H          ; save only the right three bits
  400.         MOV     BL,080H           ; here's a bit
  401.         ROR        BL,CL             ; move it over some
  402. ;
  403. ;  At this point, bl has the bit mask for the first bit in the line
  404. ;  Keep rotating it and set the mask for each bit to write
  405. ;
  406.         MOV     SI,[BP+X+4]       ; where to get the new colors
  407.  
  408.         MOV     AH,BL             ; keep bit rotation in ah
  409.         MOV     DX,[BP+X+12]      ; get segment of transtable
  410.         MOV     BX,[BP+X+10]      ; get offset of transtable
  411.  
  412. NEXTBYTE:
  413.         MOV        CX,[BP+X+14]      ; pixel expansion number
  414.         LODSB                     ; the next color to write
  415.         PUSH     DS
  416.          MOV        DS,DX             ; get the seg for xlat from dx
  417.         XLATB                      ; color translation
  418.         MOV        [BP+X],AL         ; used as a local var for translated color
  419.  
  420. NEXTP:
  421.         MOV     DX,BITMASK        ; set the bitmask to current rotation
  422.         MOV     AL,AH
  423.         OUT     DX,AL             ;  send it
  424.  
  425.         MOV        DX,MAPMASK
  426.         MOV     AL,0FH            ; open all bit planes
  427.         OUT        DX,AL             ; send it
  428.  
  429.         MOV        AL,ES:[DI]        ; latch the whole set of bytes
  430.         MOV     BYTE PTR ES:[DI],0H  ; clear all four planes to 0 at this bit
  431.         MOV        AL,[BP+X]         ; get real color from local var
  432.         OUT        DX,AL              ; send it to set the color planes
  433. ;
  434.         MOV        AL,0FFH           ; set all bits
  435.         MOV        ES:[DI],AL          ; set it!
  436.         CMP     AH,01             ; see if we are at end of byte
  437.         JNZ     SAMEBYTE
  438.         INC        DI                ; get us to the next destination byte
  439. SAMEBYTE:
  440.         ROR     AH,1              ; rotate me
  441.         LOOP    NEXTP             ; go back for next one
  442.  
  443.         MOV        DX,DS             ; reset xlat segment into dx
  444.         POP        DS                ; get data input seg back
  445.         DEC        WORD PTR [BP+X+8] ; number of data points
  446.         JNZ        NEXTBYTE          ; do another, if necessary
  447.  
  448.         POP     DS        
  449.         POP        BP
  450.         RET
  451. EGALINEA    ENDP
  452.         ENDPS
  453.         END
  454.